package modelo.bd.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import modelo.bd.ConexionPool;
import modelo.bd.excepcion.DAOException;
import modelo.dominio.Responsable;
import modelo.servicio.Pasos;

public class ResponsableDAO {

    private String query;

    public void add(Responsable entity, String usuario) throws DAOException {
        Connection conexion = null;
        PreparedStatement sentencia = null;
        PreparedStatement invalidaFlujo = null;
        try {
            query = "INSERT INTO sil_responsables_paso_flujo (repf_fluj_clave, repf_pafl_clave, repf_uspe_clave, \n"
                    + "                             repf_forzoso, repf_es_aprobador, repf_recibe_copia, repf_usuario_creo, repf_fecha_creo) \n"
                    + "VALUES('" + entity.getPaso().getFlujo().getClave().replace("'", "''") + "', '"
                    + entity.getPaso().getClave().replace("'", "''") + "', '"
                    + entity.getClave() + "', '"
                    + (entity.isForsozo() ? "S" : "N") + "', '"
                    + (entity.isAprobador() ? "S" : "N") + "', '"
                    + (entity.isRecibeCopia() ? "S" : "N") + "', '"
                    + usuario + "', SYSDATE)";
            conexion = ConexionPool.getInstancia().getConexion();
            sentencia = conexion.prepareStatement(query);
            sentencia.executeUpdate();
            invalidaFlujo = conexion.prepareStatement(
                    invalidarFlujo(entity.getPaso().getFlujo().getClave().replace("'", "''"),
                    usuario));
            invalidaFlujo.executeUpdate();
        } catch (SQLException ex) {
            throw new DAOException("Error REDA-SQL " + ex.getMessage());
        } finally {
            try {
                if (sentencia != null) {
                    sentencia.close();
                }
                if (invalidaFlujo != null) {
                    invalidaFlujo.close();
                }
                if (conexion != null) {
                    conexion.close();
                }
            } catch (SQLException ex) {
                throw new DAOException("Error REDA-SQL " + ex.getMessage());
            }
        }
    }

    public void deleteWhere(String condition) throws DAOException {
        Connection conexion = null;
        PreparedStatement sentencia = null;
        try {
            query = "DELETE sil_responsables_paso_flujo \n"
                    + "WHERE  " + condition;
            conexion = ConexionPool.getInstancia().getConexion();
            sentencia = conexion.prepareStatement(query);
            sentencia.executeUpdate();
        } catch (SQLException ex) {
            throw new DAOException("Error REDD-SQL " + ex.getMessage());
        } finally {
            try {
                if (sentencia != null) {
                    sentencia.close();
                }
                if (conexion != null) {
                    conexion.close();
                }
            } catch (SQLException ex) {
                throw new DAOException("Error REDD-SQL " + ex.getMessage());
            }
        }
    }

    public void update(Responsable entity, String usuario) throws DAOException {
        Connection conexion = null;
        PreparedStatement sentencia = null;
        PreparedStatement invalidaFlujo = null;
        try {
            query = "UPDATE sil_responsables_paso_flujo \n"
                    + "SET    repf_forzoso       = '" + (entity.isForsozo() ? "S" : "N") + "', \n"
                    + "       repf_es_aprobador  = '" + (entity.isAprobador() ? "S" : "N") + "', \n"
                    + "       repf_recibe_copia  = '" + (entity.isRecibeCopia() ? "S" : "N") + "', \n"
                    + "       repf_usuario_modif = '" + usuario + "', \n"
                    + "       repf_fecha_modif   = SYSDATE \n"
                    + "WHERE  repf_fluj_clave    = '" + entity.getPaso().getFlujo().getClave().replace("'", "''") + "' \n"
                    + "AND    repf_pafl_clave    = '" + entity.getPaso().getClave().replace("'", "''") + "' \n"
                    + "AND    repf_uspe_clave    = '" + entity.getClave() + "'";
            conexion = ConexionPool.getInstancia().getConexion();
            sentencia = conexion.prepareStatement(query);
            sentencia.executeUpdate();
            invalidaFlujo = conexion.prepareStatement(
                    invalidarFlujo(entity.getPaso().getFlujo().getClave().replace("'", "''"),
                    usuario));
            invalidaFlujo.executeUpdate();
        } catch (SQLException ex) {
            throw new DAOException("Error REDU-SQL " + ex.getMessage());
        } finally {
            try {
                if (sentencia != null) {
                    sentencia.close();
                }
                if (invalidaFlujo != null) {
                    invalidaFlujo.close();
                }
                if (conexion != null) {
                    conexion.close();
                }
            } catch (SQLException ex) {
                throw new DAOException("Error REDU-SQL " + ex.getMessage());
            }
        }
    }

    protected List<Responsable> select() throws DAOException {
        Connection conexion = null;
        PreparedStatement sentencia = null;
        ResultSet resultado = null;
        List<Responsable> resultados = null;
        try {
            conexion = ConexionPool.getInstancia().getConexion();
            sentencia = conexion.prepareStatement(query);
            resultado = sentencia.executeQuery();
            resultados = new ArrayList<Responsable>();
            while (resultado.next()) {
                Responsable responsable = new Responsable();
                responsable.setPaso(Pasos.instancia().porClave(resultado.getString("clave_flujo"), resultado.getString("clave_paso")));
                responsable.setForsozo(resultado.getString("forsozo").equalsIgnoreCase("S"));
                responsable.setAprobador(resultado.getString("aprobador").equalsIgnoreCase("S"));
                responsable.setRecibeCopia(resultado.getString("recibe_copia").equalsIgnoreCase("S"));
                responsable.setClave(resultado.getString("clave_respon"));
                responsable.setContrasena(resultado.getString("contrasena"));
                responsable.setNombre(resultado.getString("nombre"));
                resultados.add(responsable);
            }
        } catch (SQLException ex) {
            throw new DAOException("Error REDS-SQL " + ex.getMessage());
        } finally {
            try {
                if (resultado != null) {
                    resultado.close();
                }
                if (sentencia != null) {
                    sentencia.close();
                }
                if (conexion != null) {
                    conexion.close();
                }
            } catch (SQLException ex) {
                throw new DAOException("Error REDS-SQL " + ex.getMessage());
            }
        }
        return resultados;
    }

    public List<Responsable> selectAll() throws DAOException {
        query = "SELECT repf_uspe_clave   AS clave_respon, \n"
                + "       repf_forzoso      AS forsozo, \n"
                + "       repf_es_aprobador AS aprobador, \n"
                + "       repf_recibe_copia AS recibe_copia, \n"
                + "       repf_fluj_clave   AS clave_flujo, \n"
                + "       repf_pafl_clave   AS clave_paso, \n"
                + "       uspe_nombre       AS nombre, \n"
                + "       uspe_password     AS contrasena \n"
                + "FROM   sil_responsables_paso_flujo, sil_usuarios_perfil \n"
                + "WHERE  repf_uspe_clave = uspe_clave";
        return select();
    }

    public List<Responsable> selectWhere(String condition) throws DAOException {
        query = "SELECT repf_uspe_clave   AS clave_respon, \n"
                + "       repf_forzoso      AS forsozo, \n"
                + "       repf_es_aprobador AS aprobador, \n"
                + "       repf_recibe_copia AS recibe_copia, \n"
                + "       repf_fluj_clave   AS clave_flujo, \n"
                + "       repf_pafl_clave   AS clave_paso, \n"
                + "       uspe_nombre       AS nombre, \n"
                + "       uspe_password     AS contrasena \n"
                + "FROM   sil_responsables_paso_flujo, sil_usuarios_perfil \n"
                + "WHERE  repf_uspe_clave = uspe_clave \n"
                + "AND    " + condition;
        return select();
    }

    private String invalidarFlujo(String clave, String usuario) {
        return "UPDATE sil_flujos \n"
                + "SET    fluj_usuario_modif = '" + usuario + "', \n"
                + "       fluj_estatus       = 'N', \n"
                + "       fluj_fecha_modif   = SYSDATE \n"
                + "WHERE  fluj_clave         = '" + clave + "'";
    }
}
